﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Collections;

namespace GeneticAlgorithm
{
	class Mutation
	{
		static Random RD = new Random();

		// 전형적인 변이 연산
		// 부모해에 없는 속성을 도입하여 탐색 공간을 넓히려는 목적
		// AL  : Population Index
		// <Result>: 변이 처리 반환
		public static void Process( Hashtable AL )
		{
			IDictionaryEnumerator EM = AL.GetEnumerator();
			RD = new Random( DateTime.Now.Millisecond );
			double pint = RD.NextDouble();

			if ( pint < Define.MTTN )
			{
				int hkey = RD.Next( 0, Define.PLSZ );
				int indx = RD.Next( 0, Define.BTSZ );

				string wcd1 = GA.BNWT[hkey].ToString();
				string pcd1 = GA.BNPF[hkey].ToString();

				char[] tmp1 = new char[Define.BTSZ];
				char[] tmp2 = new char[Define.BTSZ];

				for ( int i = 0; i < Define.BTSZ; i++ )
				{
					if ( i == indx )
					{
						if ( wcd1[i] == '0' )
							tmp1[i] = '1';
						else
							tmp2[i] = '0';

						if ( pcd1[i] == '0' )
							tmp1[i] = '1';
						else
							tmp2[i] = '0';
					}
					else
					{
						tmp1[i] = wcd1[i];
						tmp2[i] = pcd1[i];
					}
				}

				GA.BNWT[hkey] = tmp1.ToString();
				GA.BNWT[hkey] = tmp2.ToString();
			}
		}
	}
}
